import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

# 读取图片
img = Image.open(
    'C:/Users/86178/Desktop/数字图像/numpy_calculation_question_set-master/numpy_calculation_question_set-master/dog.jpg')
img_array = np.array(img)

# 绘制三行子图
fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(12, 8), constrained_layout=True)

r, g, b = img_array[:, :, 0], img_array[:, :, 1], img_array[:, :, 2]

r_img = np.zeros_like(img_array)
r_img[:, :, 0] = r
g_img = np.zeros_like(img_array)
g_img[:, :, 1] = g
b_img = np.zeros_like(img_array)
b_img[:, :, 2] = b

#RGB单通道灰度图
r_gray = Image.fromarray(r).convert("L")
g_gray = Image.fromarray(g).convert("L")
b_gray = Image.fromarray(b).convert("L")

# 创建画布
fig, axes = plt.subplots(3, 3, figsize=(15, 15))

# 第一行：RGB原图

axes[0, 0].imshow(img)
axes[0, 0].set_title("Original Image")

img_new_rgb = np.dstack((r, g, b))
axes[0, 1].imshow(img_new_rgb)
axes[0, 1].set_title("Merged Image")

img_new_rgb_gray = np.dstack((r_gray, g_gray, b_gray))
axes[0, 2].imshow(img_new_rgb_gray)
axes[0, 2].set_title("Merged_gray Image")




# 第二行：分别显示R,G,B三通道彩图（但实际上是灰度图用彩色显示）
axes[1, 0].imshow(r_img)
axes[1, 0].set_title("R Channel ")
axes[1, 1].imshow(g_img)
axes[1, 1].set_title("G Channel ")
axes[1, 2].imshow(b_img)
axes[1, 2].set_title("B Channel ")

# 注意：下面的avg计算和像素颜色调整是不必要的，因为我们只是显示原始通道

# 第三行：分别显示R,G,B单通道灰度图
for i, ax in enumerate(axes[2, :]):
    channel = img_array[:, :, i]
    ax.imshow(channel, cmap='gray')
    ax.set_title(f'{["R", "G", "B"][i]} Channel Grayscale')
    ax.axis('off')

# 显示图像
plt.show()